home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / program / mui32dev.lha / MUI / Developer / Modula / txt / MuiClasses.mod < prev    next >
Text File  |  1996-01-23  |  9KB  |  348 lines

  1. IMPLEMENTATION MODULE MuiClasses;
  2.  
  3. (***************************************************************************
  4. **
  5. ** $VER: MuiClasses.mod 3.2 (23.1.96)
  6. **
  7. ** The following updates have been done by
  8. **
  9. **   Olaf "Olf" Peters <olf@informatik.uni-bremen.de>
  10. **
  11. ** $HISTORY:
  12. **
  13. **  23.1.96  3.2   : updated for MUI 3.2 release
  14. ** 18.11.95  3.1   : updated for MUI v3.1 release
  15. **
  16. ***************************************************************************)
  17.  
  18. (*************************************************************************
  19. ** Structures and Macros for creating MUI custom classes.
  20. **
  21. ** converted for M2 by Christian 'Kochtopf' Scholz
  22. **
  23. **************************************************************************
  24. **
  25. ** $Id: MuiClasses.mod 1.5 1995/12/15 16:37:53 olf Exp olf $
  26. **
  27. **************************************************************************)
  28.  
  29. FROM    SYSTEM      IMPORT CAST, ADR, BYTE, ADDRESS, REG, SETREG, ASSEMBLE;
  30. FROM    MuiD        IMPORT APTR;
  31.  
  32. IMPORT
  33.   ed : ExecD,
  34.   gd : GraphicsD,
  35.   id : IntuitionD,
  36.   ud : UtilityD,
  37.   R;
  38.  
  39. (*
  40. ** first some general BOOPSI-things, which aren't defined in the normal defs.
  41. *)
  42.  
  43. TYPE    object = RECORD
  44.                     oNode   : ed.MinNode;
  45.                     oClass  : id.IClassPtr;
  46.                  END;
  47.  
  48. (* get a pointer to our instance data *)
  49.  
  50. PROCEDURE InstData(cl : id.IClassPtr; obj : id.ObjectPtr) : ADDRESS;
  51.     BEGIN
  52.         RETURN (CAST(ADDRESS, obj) + ADDRESS(cl^.instOffset));
  53.     END InstData;
  54.  
  55. (* get the size ... *)
  56.  
  57. PROCEDURE InstSize(cl : id.IClassPtr) : CARDINAL;
  58.     BEGIN
  59.         RETURN cl^.instOffset+cl^.instSize+SIZE(object);
  60.     END InstSize;
  61.  
  62.  
  63. (* 
  64. ** something, which we can cast your object-pointer to
  65. ** (just used iternally)
  66. *)
  67.  
  68. TYPE    dummyXFC = RECORD
  69.                     mnd : mNotifyData;
  70.                     mad : mAreaData;
  71.                    END;
  72.  
  73.         dummyXFCPtr = POINTER TO dummyXFC;
  74.  
  75.  
  76. (*
  77. ** now the functions to get to some types of data of our object.
  78. *)
  79.  
  80. PROCEDURE muiPen(pen : LONGCARD) : LONGCARD;
  81. VAR
  82.   ret{R.D4} : LONGCARD;
  83. BEGIN
  84.     ASSEMBLE(
  85.       MOVE.L pen(A5), D4
  86.       AND.L  #muipenMask, D4
  87.     END) ;
  88.     RETURN ret ;
  89. END muiPen ;
  90.  
  91. PROCEDURE muiNotifyData(obj : APTR) : mNotifyDataPtr;
  92.     BEGIN
  93.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mnd);
  94.     END muiNotifyData;
  95.  
  96. PROCEDURE muiAreaData(obj : APTR) : mAreaDataPtr;
  97.     BEGIN
  98.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mad);
  99.     END muiAreaData;
  100.  
  101. PROCEDURE muiGlobalInfo(obj : APTR) : mGlobalInfoPtr;
  102.     BEGIN
  103.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndGlobalInfo;
  104.     END muiGlobalInfo;
  105.  
  106. PROCEDURE muiUserData(obj : APTR) : ADDRESS ;
  107.     BEGIN
  108.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndUserData;
  109.     END muiUserData;
  110.  
  111. PROCEDURE muiRenderInfo(obj : APTR) : mRenderInfoPtr;
  112.     BEGIN
  113.         RETURN CAST(dummyXFCPtr, obj)^.mad.madRenderInfo;
  114.     END muiRenderInfo;
  115.  
  116.  
  117. (*
  118. ** here the macros from mui.h.
  119. ** use them to get e.g. your rastport.
  120. *)
  121.  
  122. PROCEDURE OBJ_app(obj : APTR) : id.ObjectPtr;
  123.     BEGIN
  124.         RETURN muiGlobalInfo(obj)^.mgiApplicationObject;
  125.     END OBJ_app;
  126.  
  127. PROCEDURE OBJ_win(obj : APTR) : id.ObjectPtr;
  128.     BEGIN
  129.         RETURN muiRenderInfo(obj)^.mriWindowObject;
  130.     END OBJ_win;
  131.  
  132. PROCEDURE OBJ_dri(obj : APTR) : id.DrawInfoPtr;
  133.     BEGIN
  134.         RETURN muiRenderInfo(obj)^.mriDrawInfo;
  135.     END OBJ_dri;
  136.  
  137. PROCEDURE OBJ_screen(obj : APTR) : id.ScreenPtr;
  138.     BEGIN
  139.         RETURN muiRenderInfo(obj)^.mriScreen;
  140.     END OBJ_screen;
  141.  
  142. PROCEDURE OBJ_pens(obj : APTR) : WORDPtr;
  143.     BEGIN
  144.         RETURN muiRenderInfo(obj)^.mriPens;
  145.     END OBJ_pens;
  146.  
  147. PROCEDURE OBJ_window(obj : APTR) : id.WindowPtr;
  148.     BEGIN
  149.         RETURN muiRenderInfo(obj)^.mriWindow;
  150.     END OBJ_window;
  151.  
  152. PROCEDURE OBJ_rp(obj : APTR) : gd.RastPortPtr;
  153.     BEGIN
  154.         RETURN muiRenderInfo(obj)^.mriRastPort;
  155.     END OBJ_rp;
  156.  
  157. PROCEDURE OBJ_left(obj : APTR) : INTEGER;
  158.     BEGIN
  159.         RETURN muiAreaData(obj)^.madBox.left;
  160.     END OBJ_left;
  161.  
  162. PROCEDURE OBJ_top(obj : APTR) : INTEGER;
  163.     BEGIN
  164.         RETURN muiAreaData(obj)^.madBox.top;
  165.     END OBJ_top;
  166.  
  167. PROCEDURE OBJ_width(obj : APTR) : INTEGER;
  168.     BEGIN
  169.         RETURN muiAreaData(obj)^.madBox.width;
  170.     END OBJ_width;
  171.  
  172. PROCEDURE OBJ_height(obj : APTR) : INTEGER;
  173.     BEGIN
  174.         RETURN muiAreaData(obj)^.madBox.height;
  175.     END OBJ_height;
  176.  
  177. PROCEDURE OBJ_right(obj : APTR) : INTEGER;
  178.     BEGIN
  179.         RETURN OBJ_left(obj)+OBJ_width(obj)-1;
  180.     END OBJ_right;
  181.  
  182. PROCEDURE OBJ_bottom(obj : APTR) : INTEGER;
  183.     BEGIN
  184.         RETURN OBJ_top(obj)+OBJ_height(obj)-1;
  185.     END OBJ_bottom;
  186.  
  187. PROCEDURE OBJ_addleft(obj : APTR) : INTEGER;
  188.     BEGIN
  189.         RETURN INTEGER(muiAreaData(obj)^.madAddLeft);
  190.     END OBJ_addleft;
  191.  
  192. PROCEDURE OBJ_addtop(obj : APTR) : INTEGER;
  193.     BEGIN
  194.         RETURN INTEGER(muiAreaData(obj)^.madAddTop);
  195.     END OBJ_addtop;
  196.  
  197. PROCEDURE OBJ_subwidth(obj : APTR) : INTEGER;
  198.     BEGIN
  199.         RETURN INTEGER(muiAreaData(obj)^.madSubWidth);
  200.     END OBJ_subwidth;
  201.  
  202. PROCEDURE OBJ_subheight(obj : APTR) : INTEGER;
  203.     BEGIN
  204.         RETURN INTEGER(muiAreaData(obj)^.madSubHeight);
  205.     END OBJ_subheight;
  206.  
  207. PROCEDURE OBJ_mleft(obj : APTR) : INTEGER;
  208.     BEGIN
  209.         RETURN OBJ_left(obj)+OBJ_addleft(obj);
  210.     END OBJ_mleft;
  211.  
  212. PROCEDURE OBJ_mtop(obj : APTR) : INTEGER;
  213.     BEGIN
  214.         RETURN OBJ_top(obj)+OBJ_addtop(obj);
  215.     END OBJ_mtop;
  216.  
  217. PROCEDURE OBJ_mwidth(obj : APTR) : INTEGER;
  218.     BEGIN
  219.         RETURN OBJ_width(obj)-OBJ_subwidth(obj);
  220.     END OBJ_mwidth;
  221.  
  222. PROCEDURE OBJ_mheight(obj : APTR) : INTEGER;
  223.     BEGIN
  224.         RETURN OBJ_height(obj)-OBJ_subheight(obj);
  225.     END OBJ_mheight;
  226.  
  227. PROCEDURE OBJ_mright(obj : APTR) : INTEGER;
  228.     BEGIN
  229.         RETURN OBJ_mleft(obj)+OBJ_mwidth(obj)-1;
  230.     END OBJ_mright;
  231.  
  232. PROCEDURE OBJ_mbottom(obj : APTR) : INTEGER;
  233.     BEGIN
  234.         RETURN OBJ_mtop(obj)+OBJ_mheight(obj)-1;
  235.     END OBJ_mbottom;
  236.  
  237. PROCEDURE OBJ_font(obj : APTR) : gd.TextFontPtr;
  238.     BEGIN
  239.         RETURN muiAreaData(obj)^.madFont;
  240.     END OBJ_font;
  241.  
  242. PROCEDURE OBJ_minwidth(obj : APTR) : CARDINAL;
  243.     BEGIN
  244.         RETURN muiAreaData(obj)^.madMinMax.MinWidth;
  245.     END OBJ_minwidth;
  246.  
  247. PROCEDURE OBJ_minheight(obj : APTR) : CARDINAL;
  248.     BEGIN
  249.         RETURN muiAreaData(obj)^.madMinMax.MinHeight;
  250.     END OBJ_minheight;
  251.  
  252. PROCEDURE OBJ_maxwidth(obj : APTR) : CARDINAL;
  253.     BEGIN
  254.         RETURN muiAreaData(obj)^.madMinMax.MaxWidth;
  255.     END OBJ_maxwidth;
  256.  
  257. PROCEDURE OBJ_maxheight(obj : APTR) : CARDINAL;
  258.     BEGIN
  259.         RETURN muiAreaData(obj)^.madMinMax.MaxHeight;
  260.     END OBJ_maxheight;
  261.  
  262. PROCEDURE OBJ_defwidth(obj : APTR) : CARDINAL;
  263.     BEGIN
  264.         RETURN muiAreaData(obj)^.madMinMax.DefWidth;
  265.     END OBJ_defwidth;
  266.  
  267. PROCEDURE OBJ_defheight(obj : APTR) : CARDINAL;
  268.     BEGIN
  269.         RETURN muiAreaData(obj)^.madMinMax.DefHeight;
  270.     END OBJ_defheight;
  271.  
  272. PROCEDURE OBJ_flags(obj : APTR) : MADFlagSet;
  273.     BEGIN
  274.         RETURN muiAreaData(obj)^.madFlags;
  275.     END OBJ_flags;
  276.  
  277.  
  278. (*
  279. ** here are some new procedures to generate dispatchers which restore A4
  280. *)
  281.  
  282. (* first the 'real' dispatcher *)
  283.  
  284. PROCEDURE DispatchEntry(class{R.A0} : ud.HookPtr;
  285.                         object{R.A2}: ADDRESS;
  286.                         msg{R.A1}   : ADDRESS)     : ADDRESS;
  287.     (*$SaveA4:=TRUE*)
  288.     BEGIN
  289.         SETREG (R.A4, CAST(id.IClassPtr,class)^.dispatcher.data);
  290.         RETURN CAST(DispatcherDef,CAST(id.IClassPtr,class)^.dispatcher.subEntry)(CAST(id.IClassPtr,class), object, msg);
  291.     END DispatchEntry;
  292.  
  293. (* fill the dispatcher-record inside the class *)
  294.  
  295. PROCEDURE MakeDispatcher(entry:DispatcherDef; VAR myclass : id.IClassPtr);
  296.  
  297.     BEGIN
  298.             myclass^.dispatcher.node.succ  := NIL;
  299.             myclass^.dispatcher.node.pred  := NIL;
  300.             myclass^.dispatcher.entry      := DispatchEntry;
  301.             myclass^.dispatcher.subEntry   := CAST(ADDRESS,entry);
  302.             myclass^.dispatcher.data       := REG(R.A4);
  303.     END MakeDispatcher;
  304.  
  305.  
  306.  
  307. (* a useful PROCEDURE! *)
  308.  
  309. PROCEDURE FillMinMaxInfo (msg : mpAskMinMaxPtr; MinWidth   : CARDINAL;
  310.                                                 DefWidth   : CARDINAL;
  311.                                                 MaxWidth   : CARDINAL;
  312.                                                 MinHeight  : CARDINAL;
  313.                                                 DefHeight  : CARDINAL;
  314.                                                 MaxHeight  : CARDINAL);
  315.     BEGIN                                               
  316.  
  317.         msg^.MinMaxInfo^.MinWidth  := msg^.MinMaxInfo^.MinWidth +MinWidth;
  318.         msg^.MinMaxInfo^.DefWidth  := msg^.MinMaxInfo^.DefWidth +DefWidth;
  319.         msg^.MinMaxInfo^.MaxWidth  := msg^.MinMaxInfo^.MaxWidth +MaxWidth;
  320.  
  321.         msg^.MinMaxInfo^.MinHeight := msg^.MinMaxInfo^.MinHeight +MinHeight;
  322.         msg^.MinMaxInfo^.DefHeight := msg^.MinMaxInfo^.DefHeight +DefHeight;
  323.         msg^.MinMaxInfo^.MaxHeight := msg^.MinMaxInfo^.MaxHeight +MaxHeight;
  324.  
  325.     END FillMinMaxInfo;
  326.  
  327. (*
  328. ** 2 useful procedures for testing if some coordinates are inside your object
  329. ** (converted from the ones in class3.c. So look there how to use... )
  330. *)
  331.  
  332. PROCEDURE OBJ_between(a,x,b : INTEGER) : BOOLEAN;
  333.     BEGIN
  334.         RETURN ((x>=a) AND (x<=b));
  335.     END OBJ_between;
  336.  
  337. PROCEDURE OBJ_isInObject(x, y : INTEGER; obj : id.ObjectPtr) : BOOLEAN;
  338.     BEGIN
  339.         RETURN (OBJ_between(OBJ_mleft(obj), x, OBJ_mright(obj)) AND
  340.                 OBJ_between(OBJ_mtop(obj), y, OBJ_mbottom(obj)));
  341.     END OBJ_isInObject;
  342.  
  343.  
  344.  
  345.  
  346. END MuiClasses.
  347.  
  348.